package finalapp.exercise.util;

import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
//import android.util.Log;
//import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

import finalapp.exercise.activities.EditarLugarActivity;
import finalapp.exercise.activities.MostrarLugarActivity;
import finalapp.exercise.db.LocationsDB.Places;

/**
 * Clase que permite añadir overlays a la activity MapaLugaresActivity y gestionar
 * los eventos relacionados con las localizaciones
 * 
 * @author Alejandro Villamarin
 *
 */
public class CustomOverlay extends ItemizedOverlay<OverlayItem> {
	
	/**
	 * La coleccion de objetos OverlayItem, se añade uno cada vez que añadimos una localizacion
	 */
	private ArrayList<OverlayItem> mOverlays = new ArrayList <OverlayItem>();
	
	/**
	 * El contexto de la aplicacion
	 */
	private Context context;
	
	/**
	 * Flag que usaremos para saber si se ha hecho onTap en un marker o en otra zona del mapa
	 */
	private boolean markerSelected;
	
	/**
	 * Nos permite almacenar el indice del overlay sobre el que se ha hecho onTap
	 */
	private int selectedIndex;

	/**
	 * Constructor
	 * 
	 * @param context	Contexto de la aplicacion
	 * @param defaultMarker	El marker customizado que usaremos para cada overlay
	 */
	public CustomOverlay(Context context, Drawable defaultMarker) {
		
		super(boundCenterBottom(defaultMarker));
		this.context = context;
		
	}
	
	/**
	 * Metodo que se encarga de añadir una localizacion en el mapa, añadiendo 
	 * un elemento OverlayItem en la coleccion
	 * 
	 * @param latitud	Latitud de la localizacion
	 * @param longitud 	Longitud de la localizacion
	 * @param titulo	Nombre de la localizacion
	 * @param indice 	Clave unica de la localizacion
	 */
	public void insertarLocalizacion(double latitud, double longitud, String titulo, int indice) {

		//Obtenemos el GeoPoint a partir de la latitud y longitud
		GeoPoint punto = new GeoPoint((int) (latitud * 1E6), (int) (longitud * 1E6));
		//Le pasamos como snippet la clave unica, asi lo tenemos facil 
		OverlayItem item = new OverlayItem(punto, titulo, Integer.toString(indice));
		//añadimos el objeto en la coleccion
		mOverlays.add(item);
		populate();
	}
	
	/**
	 * Elimina todos los elementos de la coleccion, es decir, borra todas las localizaciones previas
	 */
	public void clear() {

		mOverlays.clear();
		setLastFocusedIndex(-1); 
		populate();
	}
	
	/**
	 * Devuelve el elemento especificado de la coleccion
	 * @param	i	El indice del elemento en la coleccion
	 * 
	 * @return	El objeto OverlayItem en esa posicion
	 */
	@Override
	protected OverlayItem createItem(int i) {
		return mOverlays.get(i);
	}
	
	/**
	 * Devuelve el tamaño de la coleccion
	 * 
	 * @return	Un int con el tamaño
	 */
	@Override
	public int size() {
		return mOverlays.size();
	}
	
	/**
	 * Este metodo se ejecuta cuando se hace onTap sobre una localizacion
	 * 
	 * @param	index	El indice del objeto overlay sobre el que se ha hecho onTap en la coleccion
	 * 
	 * @return	true si se ha finalizado de capturar el evento, false en caso contrario	
	 */
	@Override
	public boolean onTap(int index) {
		//marcamos el flag a true, almacenamos el indice y devolvemos false de modo que 
		//a continuacion se propage el evento a el siguiente metodo onTap
		markerSelected = true;
		selectedIndex = index;
		return false;
	}
	
	/**
	 * Este metodo se ejecuta despues del onTap (index) y nos permite discernir entre el onTap en una
	 * localizacion o en cualquier otra zona del mapa. En funcion de esto (determinado por el flag markerSelected)
	 * llamaremos a una activity u otra
	 * 
	 * @param	gp	El punto en el que se ha hecho onTap
	 * @param	mv	El objeto MapView en el que estan los overlays
	 * 
	 * @return	true si se termina la captura del evento
	 */
	@Override
	public boolean onTap (GeoPoint gp, MapView mv){
		
		super.onTap(gp,mv);
		
		//Variables que usaremos para obtener la info asociada al marker
		String nombre;
		String clave;
		double latitud;
		double longitud;
		Intent intent = new Intent();
		
		//obtenemos latitud y longitud
		latitud = (double)(gp.getLatitudeE6() / 1E6);
		longitud = (double)(gp.getLongitudeE6() /1E6);
		
		//comprobamos si se ha hecho onTap en un marker
		if (markerSelected){
			
			//obtenemos el nombre asociado
			nombre = mOverlays.get(selectedIndex).getTitle();
			//obtenemos el indice asociado
			clave = mOverlays.get(selectedIndex).getSnippet();
			//llamamos a la activity que muestra la localizacion en detalle
			intent.setClass(context, MostrarLugarActivity.class);
			//vamos añadiendo lo que nos hace falta 
			intent.putExtra(Places._ID, Integer.parseInt(clave));
			intent.putExtra(Places.NAME, nombre);
			intent.putExtra(Places.LATITUDE, latitud);
			intent.putExtra(Places.LONGITUDE, longitud);
			//tambien añadimos un string vacio para la imagen
			intent.putExtra(Places.PICTURE, "");
			//indicamos que venimos del mapa para crear editar una localizacion
			intent.putExtra("NUEVA", false);
			//llamamos a la activity
			context.startActivity(intent);
		}
		//en caso de que no se haya clic en un marker, deberemos abrir el activiy para crear una nueva localizacion
		else{
			//llamamos a la activity que permite crear una nueva localizacion
			intent.setClass(context, EditarLugarActivity.class);
			intent.putExtra(Places.LATITUDE, latitud);
			intent.putExtra(Places.LONGITUDE, longitud);
			//indicamos que venimos del mapa para crear una nueva localizacion
			intent.putExtra("NUEVA", true);
			//llamamos a la activity
			context.startActivity(intent);
		}
		
		//volvemos a poner el flag a false
		markerSelected=false;
		return true;
	}
}
